﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WindowsFormApplication.FormBase;
using WindowsFormsView;
using WindowsFormsPresenter.InventoryItem;
using WindowsFormsPresenter.InventoryItemCategory;
using WindowsFormsModel.BusinessObjects;
using WindowsFormsPresenter.Unit;
using WindowsFormsPresenter.Stock;

namespace WindowsFormApplication.FormCategoryTreeView
{
    public partial class frmMaterialDetail : frmBaseTreeViewDetail, IInventoryItemView, IInventoryItemCategoriesView, IUnitsView, IStocksView
    {
        private InventoryItemPresenter _inventoryItemPresenter;
        private InventoryItemCategoriesPresenter _inventoryItemCategoriesPresenter;
        private UnitsPresenter _unitsPresenter;
        private StocksPresenter _stocksPresenter;

        public IList<InventoryItemCategoryModel> InventoryItemCategories
        {
            set
            {
                var inventoryItemCategories = value;

                cboInventoryCategoryID.DataSource = inventoryItemCategories;
                cboInventoryCategoryID.DisplayMember = "InventoryCategoryName";
                cboInventoryCategoryID.ValueMember = "InventoryCategoryID";

                for (int i = 0; i < cboInventoryCategoryID.DisplayLayout.Bands[0].Columns.Count; i++)
                {
                    cboInventoryCategoryID.DisplayLayout.Bands[0].Columns[i].Hidden = true;
                }

                cboInventoryCategoryID.DisplayLayout.Bands[0].Columns["InventoryCategoryCode"].Hidden = false;
                cboInventoryCategoryID.DisplayLayout.Bands[0].Columns["InventoryCategoryName"].Hidden = false;

                cboInventoryCategoryID.DisplayLayout.Bands[0].Columns["InventoryCategoryCode"].Header.Caption = "Mã loại nguyên liệu";
                cboInventoryCategoryID.DisplayLayout.Bands[0].Columns["InventoryCategoryName"].Header.Caption = "Tên loại nguyên liệu";
                if (inventoryItemCategories.Count > 0)
                    cboInventoryCategoryID.Rows[0].Selected = true;
            }
        }
        public IList<UnitModel> Units
        {
            set
            {
                var units = value;

                cboUnitID.DataSource = units;
                cboUnitID.DisplayMember = "UnitName";
                cboUnitID.ValueMember = "UnitID";

                for (int i = 0; i < cboUnitID.DisplayLayout.Bands[0].Columns.Count; i++)
                {
                    cboUnitID.DisplayLayout.Bands[0].Columns[i].Hidden = true;
                }

                cboUnitID.DisplayLayout.Bands[0].Columns["UnitCode"].Hidden = false;
                cboUnitID.DisplayLayout.Bands[0].Columns["UnitName"].Hidden = false;

                cboUnitID.DisplayLayout.Bands[0].Columns["UnitCode"].Header.Caption = "Mã đơn vị tính";
                cboUnitID.DisplayLayout.Bands[0].Columns["UnitName"].Header.Caption = "Tên đơn vị tính";

                if (units.Count > 0)
                    cboUnitID.Rows[0].Selected = true;
            }
        }
        public IList<StockModel> Stocks
        {
            set
            {
                var stocks = value;

                cboStockID.DataSource = stocks;
                cboStockID.DisplayMember = "StockName";
                cboStockID.ValueMember = "StockID";

                for (int i = 0; i < cboStockID.DisplayLayout.Bands[0].Columns.Count; i++)
                {
                    cboStockID.DisplayLayout.Bands[0].Columns[i].Hidden = true;
                }

                cboStockID.DisplayLayout.Bands[0].Columns["StockCode"].Hidden = false;
                cboStockID.DisplayLayout.Bands[0].Columns["StockName"].Hidden = false;

                cboStockID.DisplayLayout.Bands[0].Columns["StockCode"].Header.Caption = "Mã kho";
                cboStockID.DisplayLayout.Bands[0].Columns["StockName"].Header.Caption = "Tên kho";

                if (stocks.Count > 0)
                    cboStockID.Rows[0].Selected = true;
            }
        }

        public string InventoryItemID { get; set; }

        public string InventoryCategoryID
        {
            get
            {
                if (cboInventoryCategoryID.Value != null)
                {
                    return cboInventoryCategoryID.Value.ToString();
                }
                else { return null; }
            }
            set { cboInventoryCategoryID.Value = value; }
        }

        public string InventoryItemCode
        {
            get { return txtInventoryItemCode.Text; }
            set { txtInventoryItemCode.Text = value; }
        }

        public string InventoryItemName
        {
            get { return txtInventoryItemName.Text; }
            set { txtInventoryItemName.Text = value; }
        }

        public string UnitID
        {
            get
            {
                if (cboUnitID.Value != null)
                {
                    return cboUnitID.Value.ToString();
                }
                else { return null; }
            }
            set { cboUnitID.Value = value; }
        }

        public decimal UnitPrice
        {
            get
            {
                if (neUnitPrice.Value != null)
                    return decimal.Parse(neUnitPrice.Value.ToString());
                else
                    return 0;
            }
            set { neUnitPrice.Value = value; }
        }

        public decimal SalesPrice
        {
            get
            {
                if (neSalesPrice.Value != null)
                    return decimal.Parse(neSalesPrice.Value.ToString());
                else
                    return 0;
            }
            set { neSalesPrice.Value = value; }
        }

        public string StockID
        {
            get
            {
                if (cboStockID.Value != null)
                {
                    return cboStockID.Value.ToString();
                }
                else { return null; }
            }
            set { cboStockID.Value = value; }
        }

        public int MinimumStock
        {
            get
            {
                if (neMinimumStock.Value != null)
                    return int.Parse(neMinimumStock.Value.ToString());
                else
                    return 0;
            }
            set { neMinimumStock.Value = value; }
        }

        public string Description
        {
            get { return txtDescription.Text; }
            set { txtDescription.Text = value; }
        }

        public bool IsActive
        {
            get { return chkIsActive.Checked; }
            set { chkIsActive.CheckedValue = value; }
        }

        public string RestaurantId { get; set; }

        public bool IsMaterial
        {
            get { return true; }
            set { value = true; }
        }

        protected override void InitData()
        {
            _inventoryItemCategoriesPresenter.DisplayActive(true);
            _unitsPresenter.DisplayActive();
            _stocksPresenter.DisplayActiveByBranch();

            if (KeyValue != null)
                _inventoryItemPresenter.Display(KeyValue);
        }

        protected override bool ValidData()
        {
            if ((string.IsNullOrEmpty(InventoryItemCode)))
            {
                ShowMessageBox("Bạn chưa nhập mã nguyên liệu !", "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtInventoryItemCode.Focus();
                return false;
            }
            if ((string.IsNullOrEmpty(InventoryItemName)))
            {
                ShowMessageBox("Bạn chưa nhập tên nguyên liệu !", "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtInventoryItemName.Focus();
                return false;
            }
            if ((string.IsNullOrEmpty(StockID)))
            {
                ShowMessageBox("Bạn chưa nhập kho lưu nguyên liệu !", "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                cboStockID.Focus();
                return false;
            }
            if (string.IsNullOrEmpty(InventoryCategoryID))
            {
                ShowMessageBox("Bạn chưa nhập mã loại nguyên liệu !", "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                cboStockID.Focus();
                return false;
            }
            return true;
        }

        protected override bool SaveData()
        {
            try
            {
                if (eActionMode == ActionMode.AddNew)
                {
                    _inventoryItemPresenter.Save();
                    ShowMessageBox("Thêm mới dữ liệu thành công !", "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    _inventoryItemPresenter.Save();
                    ShowMessageBox("Sửa dữ liệu thành công !", "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (ApplicationException ex)
            {
                ShowMessageBox(ex.Message, "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

        protected override void LoadFormDetail()
        {
            base.LoadFormDetail();

            this.ActiveControl = txtInventoryItemCode;
        }

        public frmMaterialDetail()
        {
            InitializeComponent();

            _inventoryItemPresenter = new InventoryItemPresenter(this);
            _inventoryItemCategoriesPresenter = new InventoryItemCategoriesPresenter(this);
            _unitsPresenter = new UnitsPresenter(this);
            _stocksPresenter = new StocksPresenter(this);
        }

        private void cboUnitID_ValueChanged(object sender, EventArgs e)
        {
            if (cboUnitID.IsItemInList())
            {
                lblUnit.Text = "(" + cboUnitID.Text + ")";
                lblUnitPrice.Text = "/ " + cboUnitID.Text;
                lblSalesPrice.Text = "/ " + cboUnitID.Text;
            }
        }
    }
}
